#ifndef EL_PROTOCOL_DEVICE_PROTOCOL_PROCESSOR_H
#define EL_PROTOCOL_DEVICE_PROTOCOL_PROCESSOR_H

#include <string>
#include <functional>
#include <unordered_map>
#include <memory>
#include <nlohmann/json.hpp>
#include "web_server.h"

namespace El {
namespace Protocol {

/**
 * @brief 设备协议处理器
 * 处理设备管理、视频流获取、事件订阅等相关协议
 */
class DeviceProtocolProcessor {
public:
    /**
     * @brief 获取单例实例
     * @return DeviceProtocolProcessor单例引用
     */
    static DeviceProtocolProcessor &GetInstance();

    /**
     * @brief 初始化处理器
     * @return 是否成功初始化
     */
    bool Initialize();

    /**
     * @brief 注册方法处理器到方法映射表
     * @param method_handlers 目标方法映射表
     */
    void RegisterMethodHandlers(std::unordered_map<std::string, 
        std::function<nlohmann::json(const std::string&, const nlohmann::json&)>> &method_handlers);

private:
    DeviceProtocolProcessor() = default;
    ~DeviceProtocolProcessor() = default;

    // 设备管理相关方法处理器
    nlohmann::json HandleCamerasGetStatus(const std::string &id, const nlohmann::json &params);
    nlohmann::json HandleCamerasGetStream(const std::string &id, const nlohmann::json &params);
    nlohmann::json HandleEventsSubscribe(const std::string &id, const nlohmann::json &params);
    nlohmann::json HandleEventsUnsubscribe(const std::string &id, const nlohmann::json &params);
    nlohmann::json HandleEventsGetSubscriptions(const std::string &id, const nlohmann::json &params);

    /**
     * @brief 创建错误响应
     * @param id 请求ID
     * @param code 错误码
     * @param message 错误消息
     * @param data 错误详情（可选）
     * @return 错误响应JSON
     */
    nlohmann::json CreateErrorResponse(const std::string &id, int code, const std::string &message, 
                                      const nlohmann::json &data = nullptr);

    /**
     * @brief 创建成功响应
     * @param id 请求ID
     * @param result 响应结果
     * @return 成功响应JSON
     */
    nlohmann::json CreateSuccessResponse(const std::string &id, const nlohmann::json &result);

    // 存储事件订阅信息的结构
    struct Subscription {
        std::string id;
        std::string event_type;
        std::string callback_url;
        nlohmann::json filters;
        bool active;
        std::string created_at;
    };

    // 事件订阅管理
    std::unordered_map<std::string, Subscription> subscriptions_;
};

} // namespace Protocol
} // namespace El

#endif // EL_PROTOCOL_DEVICE_PROTOCOL_PROCESSOR_H
